# coding: utf-8
from json import loads
from pathlib import Path
from typing import Union

from pandas import read_excel, DataFrame, isna

from .engin_base import FileEngineBase


def na_change(x):
    if isna(x):
        return {}
    else:
        return loads(x)


class ExcelEngine(FileEngineBase):
    def _openDataFrame(self, sheet_name: str = None) -> DataFrame:
        match self.fileName.suffix:
            case '.xls':
                engine = 'xlrd'
            case '.xlsx':
                engine = 'openpyxl'
            case '.xlsm':
                engine = 'openpyxl'
            case '.xlsb':
                engine = 'pyxlsb'
            case '.odf':
                engine = 'odf'
            case '.ods':
                engine = 'odf'
            case '.odt':
                engine = 'odf'
            case _:
                raise ValueError(f"Unsupported file type: {self.fileName.suffix}")
        dataFrame = read_excel(self.fileName, sheet_name, engine=engine)
        return dataFrame

    def read(self, to_dict=True) -> DataFrame:
        """
        读取Excel文件,将Excel文件中的数据读取到DataFrame中，并转为通用格式中的用例数据格式。
        :param to_dict:
        :return:
        """
        sheet_names = self.sheet_names()[0]
        f_df = self.dataFrame[sheet_names]
        df = DataFrame(
            columns=['模块名称', '接口名称', '用例名称', '用例描述', '是否运行', '请求数据', '断言', '提取数据'])
        df['模块名称'] = f_df['模块名称']
        df['接口名称'] = f_df['接口名称']
        df['用例名称'] = f_df['用例名称']
        df['用例描述'] = f_df['用例描述']
        df['是否运行'] = f_df['是否运行']
        f_df['请求数据'] = f_df['请求数据'].apply(na_change)
        request_data = []
        for i in range(len(f_df)):
            row = f_df.loc[i].to_dict()
            data = {
                'method': row['请求方式'],
                'url': row['请求地址'],
                **row['请求数据'],
            }
            request_data.append(data)
        df['请求数据'] = request_data
        df['断言'] = f_df['断言'].apply(na_change)
        df['提取数据'] = f_df['提取数据'].apply(na_change)
        if to_dict:
            return df.to_dict(orient='records')
        else:
            return df

    def getEnableData(self):
        df = self.read(False)
        return df[df['是否启用'] == True].to_dict(orient='records')

    def sheet_names(self) -> list:
        return list(self.dataFrame.keys())

    @classmethod
    def ApiTemplate(cls, fileName: Union[str, Path]):
        template = {
            '模块名称': '测试登录',
            '接口名称': '登录',
            '用例名称': '登录成功',
            '用例描述': '用户名正确，密码正确，登录成功',
            '是否运行': True,
            '请求方式': 'post',
            '请求地址': 'http://127.0.0.1:5000/api/login',
            '请求数据': {
                'json': {
                    'userName': '13523539583',
                    'password': 'admin@123456',
                },
            },
            '断言': [
                {
                    '断言方式': '',
                    '预期响应内容': '操作成功',
                    '实际响应内容': 'response.json().get("msg")   # 预期响应的msg值，response为requests.Response对象',
                    '断言信息': '登录失败'
                }
            ],
            '提取数据': {
                'token': ['json', '$.data.token', 0]
            }
        }
        df = DataFrame([template])
        df.index = df.index + 1
        df['请求数据'] = df['请求数据'].apply(lambda x: cls.jsonFormat(x))
        df['断言'] = df['断言'].apply(lambda x: cls.jsonFormat(x))
        df['提取数据'] = df['提取数据'].apply(lambda x: cls.jsonFormat(x))
        df.to_excel(fileName, index_label='用例编号', sheet_name='API用例模板')
